<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * //Controlador de ABM de docentes
 *  
 */
class ABM_Docentes extends CI_Controller {
    function __construct() {
        parent::__construct();
        
        
        //Si el usuario no está logueado redirijo al modulo de login.
        if(!$this->autenticacion->logueado()){
            redirect('admin/usuarios');
        }
        
        //ZONA DE CARGA DE HELPERS Y MODELOS
        $this->load->helper('form');
        $this->load->helper('html');
        
        $this->load->helper('url');
        $this->load->library('grocery_CRUD');	
        
        //ZONA DE INICIALIZACIÓN DE VARIABLES
        $this->encabezado['usuario']=$this->session->userdata('usuario');
        $this->menu['menu']='docentes';
    }
    
    /**
     * La función index simplemente ejecuta la abm() esto lo hice así porque
     * lei que si creamos el Grocery_Crud en el index a veces falla.
     */
    function index(){
        $this->abm();                                       
    }
    
    /**
     * En esta función defino todos los elementos para crear el ABM con Grocery
     * CRUD. Paso a paso y todo comentado.
     */
    function abm(){       
        //Creo el objeto crud
        $crud = new grocery_CRUD();

        //Defino Template como datatables.
        //Esto para que se pueda buscar en la tabla con javascript. Ya está todo
        //programado sólo hay que definir el 'theme' como datatables.
        //$crud->set_theme('datatables');
        //Al final no lo vamos a setaer y vamos a dejar el por defecto.

        //Defino tabla sobre la que trabajo y tipo de 'Objeto'
        //Recuerdend definir la tabla siempre con Mayúscula por el servidor Linux 
        //de la escuela.
        $crud->set_table('Docentes');
        //El subjet es el nombre que va a mostrar para identificar cada registro.
        //O sea con que vamos a trabajar. Si es la tabla Docentes, cada registro es
        //un docente. Si es la tabla TemasPorNivel cada registro es un Tema.
        $crud->set_subject('Docente');
        
        //Quito el botones borrar. Para que no se puedan borrar los registros.
        //A los sumo se deben editar y poner como inactivos.
        $crud->unset_delete();
        
        //Defino Relaciones 1-n
        //
        //set_relation(
        //          <nombre_del_campo_a_relacionar>, 
        //          <tabla_con_la_que_se_relaciona, 
        //          <campo_de_la_tabla_relacionada_a_mostrar>
        //          )
        // 
        //Ejemplos: http://www.grocerycrud.com/documentation/options_functions/set_relation
        //
        //En los ejemplos se puede ver como pasarle otros parámetros como 'where' y 'order_by'
        //pero no sé si los vamos a utilizar. Y la verdad no los probé.
        $crud->set_relation('idTipoDoc', 'TiposDoc', 'descripcion');

        //Defino Relaciones n-n
        //
        //set_relation_n_n(
        //          <nombre_que_va_a_tener_la_relacion>,    //Es sólo a título identificatorio no afecta otra cosa. Eso si sin espacios.
        //          <tabla_de_relacion>,                    //La tabla intermedia con los id's DocentesPorCurso por ej
        //          <tabla_de_selección>                    //La tabla a la cual queremos llegar. En este caso Cursos.
        //          <campo_de_relación_de esta_tabla>       //El campo de la tabla que usamos que está en la tabla de relación. Generalmente el id.
        //          <campo_de_relación_de_tabla_de_selección>//El campo de la tabla a la que queremos llegar que está en la tabla de relación. Generalmente el id.
        //          <campo_de_tabla_de_selección_a_mostrar> //El campo de la tabla destino que queremos mostrar. En en este caso el titulo del curso.
        //          )
        //
        //Ejemplos: http://www.grocerycrud.com/documentation/options_functions/set_relation_n_n
        //
        //En los ejemplos se ve que existe un campo adicional al final. Que se llama priority.
        //Es para definir si la tabla de relación tiene algún campo extra a utilizar. No lo
        //vamos a utilizar.
        $crud->set_relation_n_n('cursosAsignados', 'DocentesPorCurso', 'Cursos', 'idDocente', 'idCurso', 'titulo');
        
        //Seteo Reglas para campos
        //Las reglas son las reglas de validación de los campos. Como para correr
        //chequeos simples y ahorrar ese trabajo. Por ejemplo si los caracteres 
        //ingresados con sólo número o sólo letras o es un email válido... Etc.
        //
        //set_rules(
        //          <campo_a_validar>       //Tal y como se llama en la BBDD
        //          <etiqueta>              //Como se va mostrar el campo en mensajes de error. Por ej. en vez de 'nombreApellido' se muestra 'Nombre y Apellido'.
        //          <reglas>                //Las reglas se ingresan en una cadena de la forma 'regla1|regla2|etc'. O sea con el '|' en el medio.
        //      )
        //
        //Listado de reglas posibles: http://codeigniter.com/user_guide/libraries/form_validation.html#rulereference
        //
        //El required no es necesario para todo, ya que se define más adelante con otra función 
        //más simple. Pero si para un campo se define una regla diferente se debe incluir el
        //required. O sea, si a un campo que es requerido no le seteamos ninguna regla adicional
        //no es necesario hacer un set_rules('campo', 'Campo', 'required') porque se define más
        //adelante. Pero si le ponemos como en este caso 'valid_mail' entonces si hay que poner
        //el required porque se pisan las reglas y no lo toma de la otra función.
        $crud->set_rules('email', 'Email', 'required|valid_email');

        //Seteo campos requeridos
        //Acá se setean los campos requeridos que no tienen otras reglas adicionales.
        //No importa si se repiten con los de set_rules de hecho es mejor porque esta
        //función agrega los '*' a los campos en el formulario para indicar que son
        //requeridos.
        //Simplemente se llama a la función y se pasan como parámetro los nombres de los
        //campos. Tal y como aparecen en la BBDD.
        //
        //required_fields('campo1', 'campo2', 'campo3')
        $crud->required_fields('nombre', 'apellido', 'idTipoDoc', 'nroDoc', 'email');
        
        //Defino Columnas a Mostrar
        //Esta función sirve por si en la tabla del ABM no quiero que se muestren
        //todos los campos de la BBDD. Entonces defino que campos quiero que se muestren
        //en esa tabla. Esto no afecta los campos que se ven en el formulario de carga
        //o de edición.
        //La sintaxis es igual a la de required_fields().
        $crud->columns('nombre', 'apellido', 'idTipoDoc', 'nroDoc', 'telefono', 'celular');
        
        //Defino campos de formulario.
        //Esta función sirve por si en el formulario del ABM no quiero que se muestren
        //todos los campos de la BBDD. Entonces defino que campos quiero que se muestren
        //en ese formulario. Esto afecta los campos que se ven en el formulario de carga
        //y el de edición. Pero no a la tabla que muestra todos los registros.
        //La sintaxis es igual a la de required_fields().
        //
        //$crud->fields('campo1', 'campo2', 'campo3')
        //
        //En este caso no lo uso pero puede ser útil en otra tabla.
        
        //Defino nombres para cada campo.
        //Esta función sirve para cambiar los nombres de las columnas por nombres
        //más leibles. Así nombreApellido se va a mostrar como Nombre y Apellido.
        //
        //display_as(
        //      <nombre_campo>,         //Tal y como está en la BBDD
        //      <etiqueta>              //Como queremos que se llame
        //      )
        //
        //Los campos que surjen de relaciones n a n también pueden ser etiquetados.
        $crud->display_as('nombre', 'Nombre');
        $crud->display_as('apellido', 'Apellido');
        $crud->display_as('idTipoDoc', 'Tipo de Documento');
        $crud->display_as('nroDoc', 'N&uacute;mero de Documento');
        $crud->display_as('domicilio', 'Domicilio');
        $crud->display_as('telefono', 'Tel&eacute;fono');
        $crud->display_as('celular', 'Celular');
        $crud->display_as('email', 'Email');
        $crud->display_as('cursosAsignados', 'Cursos Asignados');
        
        
        //Hago 'callbacks' para transformar datos antes de inserción/actualización.
        //Los callbacks son procendimientos que se ejecutan en un momento dado. Por
        //ejemplo antes o después de una inserción o actualización. Sirven por ejemplo
        //para transformar los datos antes de meterlos en la BBDD o para guardar un
        //después de haber terminado la inserción o actualización.
        //
        //callback_before_insert(array($this, <función_a_llamar>);
        //callback_after_insert(array($this, <función_a_llamar>);
        //
        //Las funciones a llamar deben estar definidas en el controlador correspondiente.
        //$crud->callback_before_insert(array($this, '_transformar_htmlentities'));
        //$crud->callback_before_update(array($this, '_transformar_htmlentities'));
        $crud->callback_after_insert(array($this, '_callback_insercion'));
        $crud->callback_after_update(array($this, '_callback_edicion'));
        
        //Genero el ABM
        //Esta función genera todo el cógido necesario para mostrar el ABM y lo
        //devuelve como una cadena.
        $output=$crud->render();

        //Llamo a la función encargada de mostrar el ABM.
        $this->mostrar_crud($output);
    }        
    
    
    /**
     * Esta función carga los elementos del template y los aplica junto con el ABM
     * de Grocery CRUD.
     * Es privada por lo que sólo puede ser llamada desde dentro de este controlador
     * por otra función. Si se quiere usar por la URL (admin/abm_lo-que-sea/mostrar_crud)
     * no se puede, dice como que no existe.
     * 
     * @param object $output Producto de $crud->render()
     * @param string $vista Es para decir que vista va a usar dentro del ABM correspondiente, por defecto es la abm_view
     */
    private function mostrar_crud($output = null, $vista='abm_view'){   
        //El parámetro ABM le dice a la vista si estamos usando Grocery CRUD
        //En caso TRUE carga todos los CSS y JS necesarios.
        $this->encabezado['abm']=TRUE;
        
        //Estas línes le pasan al encabezado que archivos de JavaScript y CSS cargar
        //Para el Grocery CRUD
        $this->encabezado['js_files']=$output->js_files;
        $this->encabezado['css_files']=$output->css_files;
        
        //Cargo el encabezado y le paso los datos.
        $this->load->view('admin/template/encabezado', $this->encabezado);
        
        //Cargo el menú con los datos definidos en el __construct para mostrar
        //en que parte de la aplicación estamos.
        $this->load->view('admin/template/menu', $this->menu);
        
        //Cargo una vista que se va a mostrar antes de la tabla de ABM.
        //Esto sirve por si hay que mostrar algo más antes o simplemente para
        //poner un título a la página. Por defecto $vista toma el valor 'abm_view'
        //pero como es un parametro de esta función puede ser modificado para que 
        //muestre otra vista dentro de la carpeta de abm correspondiente.
        $this->load->view("admin/abm_docentes/$vista");
        
        //Ahora cargo el ABM de Gorcery CRUD específicamente. Esta vista es la 
        //misma para todos los controladores. Porque lo único que hace es mostrar
        //un echo de $output. Que es lo que genero el $crud->render()
	$this->load->view('admin/crud/crud_view',$output);	
        
        //Muestro el pie de página... Acá no hay secretos jajaja...
        $this->load->view('admin/template/footer');
    }
    
    /**
     * Esta función transforma los valores antes de insertarlos en la BBDD. Así
     * cambia un 'á' por un '&aacute;' o 'ñ' por '&ntilde'. Hay que modificarla
     * para que convierta los campos que sean necesarios.
     * La función devuelve un array que es el que se va a mandar a la BBDD.
     * 
     * El nombre de la función empieza con '_' esto es porque de esa forma no
     * puede ser llamada por URL (como con mostrar_crud que es privada) pero si
     * puede ser llamada desde otra parte de la aplicación (de forma interna).
     * Esto es así porque la tiene que llamar el Grocery CRUD para que formatear
     * los datos.
     * 
     * @return array
     */
    function _transformar_htmlentities(){
        //Recupero todos los datos ingresados.
        $post_array=$this->input->post();
        
        //Convierto a 'acute' los campos necesarios.
        $post_array['nombre']=htmlentities($post_array['nombre']);
        $post_array['apellido']=htmlentities($post_array['apellido']);
        $post_array['domicilio']=htmlentities($post_array['domicilio']);
        $post_array['email']=htmlentities($post_array['email']);
        
        //Devuelvo el array con los datos ya formateados.
        return $post_array;
    }
    
    function _callback_insercion($post_array, $primary_key){
        //Inserto el registro
        $registro="Insertó docente id: $primary_key";
        $this->registro_actividad->cargar_registro($this->session->userdata('id'), $registro);
    }
    
    function _callback_edicion($post_array, $primary_key){
        //Inserto el registro
        $registro="Editó docente id: $primary_key";
        $this->registro_actividad->cargar_registro($this->session->userdata('id'), $registro);
    }
}

/* End of file abm_docentes.php */
/* Location: ./application/controllers/abm_docentes.php */